package com.rc.web.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.rc.common.constant.RoleEnum;
import com.rc.pojo.dto.user.PageUserDTO;
import com.rc.pojo.po.User;
import com.rc.pojo.vo.user.UserPageVO;

import static com.rc.pojo.po.table.UserTableDef.USER;

/**
 * 用户表 映射层。
 * 提供用户相关的数据库操作接口
 */
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据用户名或手机号查询用户
     * @param username 用户名
     * @param phone 手机号
     * @return 用户实体
     */
    default User selectByUserNameOrPhone(String username,String phone){
        return selectOneByQuery(QueryWrapper.create()
                .where(USER.USERNAME.eq(username))
                .or(USER.PHONE.eq(phone))
        );
    }

    /**
     * 根据用户名查询用户数量
     * @param username 用户名
     * @return 用户数量
     */
    default long selectCountByUserName(String username){
        return selectCountByQuery(QueryWrapper.create()
                .where(USER.USERNAME.eq(username))
        );
    }

    /**
     * 分页查询用户
     * @param dto 分页查询条件
     * @return 分页结果
     */
    default Page<UserPageVO> selectPage(PageUserDTO dto){
        return paginateAs(dto.getCurrent(), dto.getPageSize(),QueryWrapper.create()
                .where(USER.SEX.eq(dto.getSex()))
                .and(USER.NAME.like(dto.getName()))
                .and(USER.ID.ne(dto.getUserId()))
                .and(USER.STATUS.eq(dto.getStatus()))
                        .and(USER.ROLE.eq(dto.getRole()))
                , UserPageVO.class);
    }

    /**
     * 重置用户密码
     * @param password 新密码
     * @param id 用户ID
     * @return 是否成功
     */
    default boolean resetPassword(String password,long id){
        return UpdateChain.of(this)
                .set(USER.PASSWORD,password)
                .where(USER.ID.eq(id))
                .update();
    }

    /**
     * 查询农场管理员
     * @param farmId 农场ID
     * @return 用户实体
     */
    default User selectFarmAdmin(long farmId) {
        return selectOneByQuery(QueryWrapper.create()
                .where(USER.ROLE.eq(RoleEnum.FARM_ADMIN))
                .and(USER.FARM_ID.eq(farmId))
        );
    }
}
